package Servlets;

import Estructuras.Principales.ClientesPrincipalDTO;
import Estructuras.Principales.LogisticaPrincipal;
import Estructuras.Principales.TarryPrincipal;
import Herramientas.RedireccionPOPUP;
import TarryDAOS.CarteraVencidaDAO;
import TarryDAOS.ClientesDAO;
import TarryDAOS.RegistroEnvioDAO;
import TarryDAOS.TarryPedidosDAO;
import TarryDTOS.CarteraVencidaDTO;
import TarryDTOS.RegistroEnvioDTO;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author SuperLap
 */
@WebServlet(name = "Logistica", urlPatterns = {"/Logistica"})
public class Logistica extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            String action = request.getParameter("action");
            HttpSession session = request.getSession();

// TERMINAL TPV
            if (action.equals("principal")) {
                this.principal(request, response, session);
            } else if (action.equals("nuevoEnvio")) {
                this.nuevoEnvio(request, response, session);
            } else if (action.equals("nuevoEnvio")) {
                this.nuevoEnvio(request, response, session);
            } else if (action.equals("enviados")) {
                this.enviados(request, response, session);
            } else if (action.equals("pedidoEntregado")) {
                this.pedidoEntregado(request, response, session);
            } else if (action.equals("entregados")) {
                this.entregados(request, response, session);

            } else {
                System.out.println("ERROR AL ENTRAR A UN SERVICIO");
            }

        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    /**
     * ALAN GONZALEZ | PRINCIPAL -- MUESTRA TODOS LOS PEDIDOS ESTAN LISTOS PARA
     * ENVIARSE
     *
     * @param request
     * @param response
     * @param session
     */
    public void principal(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        TarryPrincipal principal = new TarryPrincipal();
        TarryPedidosDAO pedidosDAO = new TarryPedidosDAO();
        Vector pedidosEntrega = pedidosDAO.pedidosSurtidos();
        principal.setPedidos(pedidosEntrega);

        System.out.println("el tamaño es: " + pedidosEntrega.size());
        session.setAttribute("principalTarry", principal);

        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/LogisticaJSP/EnviosAdmin.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ ESTE SERVICIO ABRE UN POP UP PARA CREAR UN NUEVO REGISTRO
     * DE ENVIOS
     *
     * @param request
     * @param response
     * @param session
     */
    public void nuevoEnvio(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        TarryPedidosDAO pedidosDAO = new TarryPedidosDAO();
        RegistroEnvioDAO registroEnviosDAO = new RegistroEnvioDAO();
        Vector errores = new Vector();
        LogisticaPrincipal principal = new LogisticaPrincipal();
        int index = Integer.parseInt(request.getParameter("index"));
        int banderaCtrlInterfaz = 0;
        switch (index) {
            case 1:
                // MUESTRO EL JSP POP
                int idPedido = Integer.parseInt(request.getParameter("idPedido"));
                banderaCtrlInterfaz = 1;
                session.setAttribute("banderaCtrlInterfaz", banderaCtrlInterfaz);
                errores.clear();
                principal.setErrores(errores);
                principal.setnErrores(errores.size());

                principal.setIdPedidoApuntador(idPedido);

                session.setAttribute("logisticaPrincipal", principal);
                RequestDispatcher a = request.getRequestDispatcher("TarryJSP/LogisticaJSP/nuevoRegistroEnvio.jsp");
                try {
                    a.forward(request, response);
                } catch (ServletException ex) {
                    Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
                }
                break;
            case 2:
                errores.clear();
                principal.setErrores(errores);
                principal.setnErrores(errores.size());
                session.setAttribute("logisticaPrincipal", principal);
                int idPedido2 = Integer.parseInt(request.getParameter("idPedido"));

                int medioReparto = Integer.parseInt(request.getParameter("medioReparto"));

                if (medioReparto == 1) {
                    banderaCtrlInterfaz = 2;

                } else if (medioReparto == 2) { // EQUIPO DE REPARTO
                    banderaCtrlInterfaz = 2;

                } else if (medioReparto == 3) { // FLETERAS
                    banderaCtrlInterfaz = 3;

                } else if (medioReparto == 0) {
                    banderaCtrlInterfaz = 1;
                    errores.add("SELECCIONE MEDIO DE TRANSPORTE ");
                }

                if (errores.size() > 0) {
                    principal.setErrores(errores);
                    principal.setnErrores(errores.size());

                    principal.setIdPedidoApuntador(idPedido2);
                    session.setAttribute("banderaCtrlInterfaz", banderaCtrlInterfaz);
                    session.setAttribute("logisticaPrincipal", principal);

                    RequestDispatcher b = request.getRequestDispatcher("TarryJSP/LogisticaJSP/nuevoRegistroEnvio.jsp");
                    try {
                        b.forward(request, response);
                    } catch (ServletException ex) {
                        Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } else {
                    errores.clear();
                    principal.setErrores(errores);
                    principal.setnErrores(errores.size());
                    principal.setIdPedidoApuntador(idPedido2);
                    session.setAttribute("logisticaPrincipal", principal);
                    session.setAttribute("banderaCtrlInterfaz", banderaCtrlInterfaz);
                    RequestDispatcher b = request.getRequestDispatcher("TarryJSP/LogisticaJSP/nuevoRegistroEnvio.jsp");
                    try {
                        b.forward(request, response);
                    } catch (ServletException ex) {
                        Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                break;

            case 3:
                // RECUPERA DATOS Y GENERA VALIDACIONES POR EQUIPO DE REPARTO LOCAL

                RegistroEnvioDTO registro = new RegistroEnvioDTO();
                int idPedido3 = Integer.parseInt(request.getParameter("idPedido"));
                registro.setIdPedido(idPedido3);

                int vehiculo = Integer.parseInt(request.getParameter("vehiculo"));
                int conductor = Integer.parseInt(request.getParameter("conductor"));
                int folioFiscal = 0;

                String observaciones = new String();

                Vector erroresValidacion = new Vector();

                if (vehiculo > 0) {
                    registro.setIdVehiculo(vehiculo);
                } else {
                    erroresValidacion.add("SELECCIONE UN VEHICULO PARA EL REPARTO DE LA MERCANCIA");
                }

                if (conductor > 0) {
                    registro.setIdConductor(conductor);
                } else {
                    erroresValidacion.add("SELECCIONE UN CONDUCTOR PARA EL REPARTO DE LA MERCANCIA");
                }

                if (request.getParameter("folioFiscal").length() > 0) {
                    folioFiscal = Integer.parseInt(request.getParameter("folioFiscal"));
                    registro.setFolioFiscal(folioFiscal);
                } else {
                    erroresValidacion.add("INGRESE EL FOLIO DE FACTURA O REMISION FISCAL");
                }

                if (request.getParameter("observaciones").length() > 0) {
                    observaciones = request.getParameter("observaciones");
                    registro.setObservaciones(observaciones);
                } else {
                    registro.setObservaciones("NA");
                }

                if (erroresValidacion.size() == 0) {
                    erroresValidacion.clear();
                    principal.setErrores(erroresValidacion);
                    principal.setnErrores(erroresValidacion.size());

                    // SE REALIZA EL REGISTRO Y EL CAMBIO DE BANDERA
                    registroEnviosDAO.nuevoRegistroEnvio(registro);
                    pedidosDAO.actualizaBanderaEstadoEnviado(registro.getIdPedido());
                    // SE REALIZA EL REGISTRO Y EL CAMBIO DE BANDERA

                    RequestDispatcher b = request.getRequestDispatcher("TarryJSP/LogisticaJSP/nuevoRegistroEnvio.jsp"); //  REDIRECCIONA AL POP UP LOADING CON LAS VARIABLES CORRECTAS
                    try {
                        b.forward(request, response);
                    } catch (ServletException ex) {
                        Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
                    }

                } else {
                    principal.setErrores(erroresValidacion);
                    principal.setnErrores(erroresValidacion.size());
                    RequestDispatcher b = request.getRequestDispatcher("TarryJSP/LogisticaJSP/nuevoRegistroEnvio.jsp"); //  REDIRECCIONA AL JSP POPUP
                    try {
                        b.forward(request, response);
                    } catch (ServletException ex) {
                        Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                break;
            case 4:
                // RECUPERA DATOS Y GENERA VALIDACIONES POR EQUIPO DE REPARTO EXTERNO (FLETERAS)
                Vector erroresValidacion2 = new Vector();
                RegistroEnvioDTO registro2 = new RegistroEnvioDTO();
                int idPedidoFletera = Integer.parseInt(request.getParameter("idPedido")); // viene en hidden no nulo
                String observaciones2 = new String();
                int folioFiscal2 = 0;
                int nUnidadReparto = 0;

                registro2.setIdPedido(idPedidoFletera);

                int idFletera = Integer.parseInt(request.getParameter("fletera"));

                if (idFletera > 0) {
                    registro2.setIdfletera(idFletera);
                } else {
                    erroresValidacion2.add("SELECCIONE UNA EMPRESA FLETERA ");
                }

                if (request.getParameter("folioFiscal").length() > 0) {
                    folioFiscal2 = Integer.parseInt(request.getParameter("folioFiscal"));
                    registro2.setFolioFiscal(folioFiscal2);
                } else {
                    erroresValidacion2.add("INGRESE EL FOLIO DE FACTURA O REMISION FISCAL");
                }

                if (request.getParameter("nUnidad").length() > 0) {
                    nUnidadReparto = Integer.parseInt(request.getParameter("nUnidad"));
                    registro2.setNumeroUnidad(nUnidadReparto);
                } else {
                    erroresValidacion2.add("INGRESE EL NUMERO DE UNIDAD DE LA FLETERA");
                }

                if (request.getParameter("observaciones").length() > 0) {
                    observaciones2 = request.getParameter("observaciones");
                    registro2.setObservaciones(observaciones2);
                } else {
                    registro2.setObservaciones("NA");
                }

                if (erroresValidacion2.size() == 0) {
                    erroresValidacion2.clear();
                    principal.setErrores(erroresValidacion2);
                    principal.setnErrores(erroresValidacion2.size());

                    // SE REALIZA EL REGISTRO
                    registroEnviosDAO.nuevoRegistroEnvio(registro2);
                    pedidosDAO.actualizaBanderaEstadoEnviado(registro2.getIdPedido());

                    // SE REALIZA EL REGISTRO
                    RedireccionPOPUP redireccion = new RedireccionPOPUP();
                    redireccion.setServicio("./Logistica?action=principal");
                    session.setAttribute("sistema", redireccion);

                    RequestDispatcher b = request.getRequestDispatcher("loading.jsp"); //  REDIRECCIONA AL POP UP LOADING CON LAS VARIABLES CORRECTAS
                    try {
                        b.forward(request, response);
                    } catch (ServletException ex) {
                        Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
                    }

                } else {
                    principal.setErrores(erroresValidacion2);
                    principal.setnErrores(erroresValidacion2.size());
                    session.setAttribute("logisticaPrincipal", principal);
                    RequestDispatcher b = request.getRequestDispatcher("TarryJSP/LogisticaJSP/nuevoRegistroEnvio.jsp"); //  REDIRECCIONA AL JSP POPUP
                    try {
                        b.forward(request, response);
                    } catch (ServletException ex) {
                        Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (IOException ex) {
                        Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }

                break;
        }
    }

    /**
     * ALAN GONZALEZ SERVICIO PARA OBTENER TODOS LOS PEDIDOS CON ESTADO DE
     * ENVIADO SE PODRAN FILTRAR CON FOLIO DE FACTURA O REMISION
     *
     * @param request
     * @param response
     * @param session
     */
    public void enviados(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        TarryPrincipal principal = new TarryPrincipal();
        TarryPedidosDAO pedidosDAO = new TarryPedidosDAO();

        Vector envios = pedidosDAO.pedidosEnviados();
        principal.setPedidosEnviados(envios);

        session.setAttribute("principalTarry", principal);
        RequestDispatcher b = request.getRequestDispatcher("TarryJSP/LogisticaJSP/pedidosEnviados.jsp"); //  REDIRECCIONA AL JSP POPUP
        try {
            b.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ ESTE SERVICIO CAMBIA LA BANDERA DE ESTADO DEL PEDIDO DE
     * ENVIADO A ENTREGADO y CALCULA Y ACTUALIZA LAS FECHAS ATENCIO EL ACCESO A
     * ESTE SERVICIO ES UNITARIO O SE REINICIARIA EL CREDITO CADA EJECUCION EL
     * CONTROL SE EJECUTARA EN SU INTERFAZ CON EL VALOR DEL ESTADO CREDITICIO
     *
     * @param request
     * @param response
     * @param session
     */
    public void pedidoEntregado(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        int idpedido = Integer.parseInt(request.getParameter("idPedido"));

        // 1.- ACTUALIZA LA BANDERA DE ESTADO DEL PEDIDO EN LA TABLA DE PEDIDOS LAS BANDERAS DEL ESTADO CREDITICIO SE ACTUAOLIZAN DE MNAERA AUTOMATICA
        // 2.- BUSCA EL REGISTRO CARTERA CREDITICIA SI EL NUMERO 
        // DE DIAS DE CREDITO ES MAYOR SE REALIZAN LOS CALCULOS DE FECHAS CON EL UPDATE DE ESE REGISTRO
        TarryPedidosDAO pedidosDAO = new TarryPedidosDAO();
        pedidosDAO.actualizarBanderaEntregado(idpedido); //

        CarteraVencidaDAO carteraVencidaDAO = new CarteraVencidaDAO();
        CarteraVencidaDTO carteraVencidaDTO = new CarteraVencidaDTO();
        carteraVencidaDTO = carteraVencidaDAO.estadoCreditoPedido(idpedido);

        carteraVencidaDAO.iniciaCreditoPedido(idpedido);
        
        carteraVencidaDAO.controladorBanderasCredito(1);
        carteraVencidaDAO.controladorBanderasCredito(2);
        carteraVencidaDAO.controladorBanderasCredito(3);
        carteraVencidaDAO.controladorBanderasCredito(4);

        RequestDispatcher b = request.getRequestDispatcher("./Logistica?action=entregados"); //  REDIRECCIONA AL JSP POPUP
        try {
            b.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ
     *
     * @param request
     * @param response
     * @param session
     */
    public void entregados(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        TarryPrincipal principal = new TarryPrincipal();
        TarryPedidosDAO pedidosDAO = new TarryPedidosDAO();

        Vector entregados = pedidosDAO.pedidosEntregados();
        principal.setPedidosEntregados(entregados);

        session.setAttribute("principalTarry", principal);
        RequestDispatcher b = request.getRequestDispatcher("TarryJSP/LogisticaJSP/pedidosEntregados.jsp"); //  REDIRECCIONA AL JSP POPUP
        try {
            b.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Logistica.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
